const cp = require('child_process'),//node_modules默认就有的这个库
      nanoId = require('nanoid'),
      Qiniu = require('qiniu'),
      crypto = require('crypto'),
      { resolve } = require('path'),
      { qiniu, cryptoSecret } = require('../config/config');


//开启子进程
function startProcess (options) {
    const script = resolve(__dirname, options.path),
            child = cp.fork(script, []);

    //申明子进程是否被调用
    let invoked = false;

    child.on('message', data => {
        options.message(data);
    });

    child.on('exit', code => {
        if (invoked) {
            return;
        }

        invoked = true;
        options.exit(code);
    });

    child.on('error', err => {
        if (invoked) {
            return;
        }

        invoked = true;
        options.error(err);
    });
};

//上传七牛云的方法，里面的写法都是固定的，七牛手册上的东西
function qiniuUpload (options) {
    const mac = new Qiniu.auth.digest.Mac(qiniu.keys.ak, qiniu.keys.sk),
            conf = new Qiniu.conf.Config(),//七牛本身自己的配置
            client = new Qiniu.rs.BucketManager(mac, conf),//启动一个本地客户端，因为上传图片到七牛
            key = nanoId() + options.ext;//这个key实际就是图片的文件名，用nanoId随机生成一个字符串，options.ext是文件的后缀

    return new Promise((resolve, reject) => {
        //将哪一个url地址上的图片，上传到七牛云服务的options.bucket这个空间去，要定什么key（图片文件名），回调函数
        client.fetch(options.url, options.bucket, key, (error, ret, info) => {//(error, ret, info): 错误，返回值，上传的相关信息
            if (error) {
                reject(error);
            } else {
                if (info.statusCode === 200) {//表示上传成功
                    resolve({ key })
                } else {
                    reject(info)
                }
            }
        })
    })
};

//加密
function makeCrypto (str) {
    const _md5 = crypto.createHash('md5'),
          content = `str=${str}&secret=${cryptoSecret}`;

    return _md5.update(content).digest('hex');//hex: 16进制的形式
}

//去空格
function trimSpace (str) {
    return str.replace(/\s+/g, '');
}

//
function returnInfo (Info, data) {
    if (data) {
        Info.data = data;
    }

    return Info;
}

module.exports = {
    startProcess,
    qiniuUpload,
    makeCrypto,
    trimSpace,
    returnInfo
}